import 'reflect-metadata'

/**
 * 返回一个装饰器
 * @param {*} metadataKey 元数据的 key
 * @param {*} metadataValue  元数据的 value
 */
export function SetMetadata(metadataKey, metadataValue) {
  /**
   * 如果是类装饰器则只有1个参数: 类本身
   * 如果是方法装饰器则拥有3个参数: 类的原型对象 被装饰的方法名 属性描述符
   */
  return (target: Function | Object, propertyKey?: string, descriptor?: PropertyDescriptor) => {
    if (descriptor) { // 方法装饰器
      // 给方法装饰器添加一个 metadataKey 元数据 值是 metadataValue
      Reflect.defineMetadata(metadataKey, metadataValue, descriptor.value)
    } else { // 类装饰器
      // 给类装饰器添加一个 metadataKey 元数据 值是 metadataValue
      Reflect.defineMetadata(metadataKey, metadataValue, target)
    }
  }
}
